package thread;
class SingletonLazy{
    private volatile static  SingletonLazy insatnce=null;//禁止instance在创建的时候指令重排序,防止创建了但还没有在内存里调用构造方法的情况
    static Object locker1=new Object();
    public static SingletonLazy getInstance(){
        /**
         * 第一个if判断是否需要加锁
         * 如果instance是null,就说明是首次调用,那么就需要考虑线程安全问题,就要进行加速偶
         * 如果不是null,说明不是第一次调用,就不需要考虑线程安全,就不必进行加锁了
         * 第二个if是用来判断是否需要创建实例
         */
        if(insatnce==null) {
            synchronized (locker1) {
                /**
                 * 在这里进行加锁,就可以确保,只有一个实例会被创建出来
                 * 这里的synchronized有可能进入到阻塞当中去,如果进入到阻塞,那么这里的实例instance就会被其他的线程创建出来
                 */
                if (insatnce == null) {
                    insatnce = new SingletonLazy();
                }
            }
        }
        return insatnce;

    }
    private SingletonLazy(){};
}
public class ThreadDemo25 {
    public static void main(String[] args) {
        SingletonLazy s1=SingletonLazy.getInstance();
        SingletonLazy s2=SingletonLazy.getInstance();
        System.out.println(s1==s2);
    }
}
